<template><div><p>本文档最新版为 <a href="https://learnku.com/docs/laravel/10.x" target="_blank" rel="noopener noreferrer">10.x</a>，旧版本可能放弃维护，推荐阅读最新版！</p>
<h2 id="配置" tabindex="-1"><a class="header-anchor" href="#配置"><span>配置</span></a></h2>
<ul>
<li>
<p><a href="#introduction">介绍</a></p>
</li>
<li>
<p><a href="#environment-configuration">环境配置</a></p>
<ul>
<li><a href="#environment-variable-types">环境变量类型</a></li>
<li><a href="#retrieving-environment-configuration">检索环境配置</a></li>
<li><a href="#determining-the-current-environment">确定当前环境</a></li>
<li><a href="#encrypting-environment-files">加密环境文件</a></li>
</ul>
</li>
<li>
<p><a href="#accessing-configuration-values">访问配置值</a></p>
</li>
<li>
<p><a href="#configuration-caching">配置缓存</a></p>
</li>
<li>
<p><a href="#configuration-publishing">配置发布</a></p>
</li>
<li>
<p><a href="#debug-mode">调试模式</a></p>
</li>
<li>
<p><a href="#maintenance-mode">维护模式</a></p>
<h2 id="介绍" tabindex="-1"><a class="header-anchor" href="#介绍"><span>介绍</span></a></h2>
<p>Laravel框架的所有配置文件都存储在 <code v-pre>config</code> 目录中。每个选项都有文档说明，因此您可以随意查看这些文件，并熟悉可用的选项。<br>
这些配置文件允许您配置数据库连接信息、邮件服务器信息以及各种其他核心配置值，例如应用程序时区和加密密钥。</p>
<h4 id="about-命令" tabindex="-1"><a class="header-anchor" href="#about-命令"><span><code v-pre>about</code> 命令</span></a></h4>
<p>Laravel可以通过 <code v-pre>about</code> Artisan命令显示应用程序配置、驱动程序和环境的概览。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan about</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>如果您只对应用程序概览输出的特定部分感兴趣，您可以使用 <code v-pre>--only</code> 选项进行筛选：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan about <span class="token parameter variable">--only</span><span class="token operator">=</span>environment</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>或者，要详细查看特定配置文件的值，您可以使用 <code v-pre>config:show</code> Artisan命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan config:show database</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2 id="环境配置" tabindex="-1"><a class="header-anchor" href="#环境配置"><span>环境配置</span></a></h2>
<p>在不同环境中运行应用程序时，具有不同的配置值通常很有帮助。例如，您可能希望在本地使用与生产服务器使用不同的缓存驱动程序。<br>
为了简化这个过程，Laravel 使用了 <a href="https://github.com/vlucas/phpdotenv" target="_blank" rel="noopener noreferrer">DotEnv</a> PHP 库。在全新的 Laravel 安装中，应用程序的根目录将包含一个 <code v-pre>.env.example</code> 文件，该文件定义了许多常见的环境变量。在 Laravel 安装过程中，该文件将自动复制为 <code v-pre>.env</code>。</p>
</li>
</ul>
<p>Laravel 的默认 <code v-pre>.env</code> 文件包含一些常见的配置值，这些值可能会根据您的应用程序是在本地运行还是在生产 web 服务器上运行而有所不同。然后，这些值会被 <code v-pre>config</code> 目录中的配置文件通过 Laravel 的 <code v-pre>env</code> 函数读取。<br>
如果您正在与团队一起开发，您可能希望继续在应用程序中包含和更新 <code v-pre>.env.example</code> 文件。通过在示例配置文件中放置占位符值，您的团队成员可以清楚地看到运行应用程序需要哪些环境变量。</p>
<blockquote>
<p><strong>注意</strong><br>
您的 <code v-pre>.env</code> 文件中的任何变量都可以被外部环境变量覆盖，例如服务器级别或系统级别的环境变量。</p>
</blockquote>
<h4 id="环境文件安全性" tabindex="-1"><a class="header-anchor" href="#环境文件安全性"><span>环境文件安全性</span></a></h4>
<p>您的 <code v-pre>.env</code> 文件不应提交到应用程序的源代码控制中，因为每个使用您的应用程序的开发者/服务器可能需要不同的环境配置。此外，如果入侵者获得了对您源代码控制仓库的访问权限，这将是一个安全风险，因为任何敏感的凭据都会被暴露。<br>
然而，您可以使用 Laravel 内置的 <a href="#encrypting-environment-files">环境加密</a> 来加密您的环境文件。加密的环境文件可以安全地放置在源代码控制中。</p>
<h4 id="附加环境文件" tabindex="-1"><a class="header-anchor" href="#附加环境文件"><span>附加环境文件</span></a></h4>
<p>在加载应用程序的环境变量之前，Laravel 会确定是否外部提供了 <code v-pre>APP_ENV</code> 环境变量，或者是否指定了 <code v-pre>--env</code> CLI 参数。如果是这样，Laravel 将尝试加载存在的 <code v-pre>.env.[APP_ENV]</code> 文件。如果不存在，将加载默认的 <code v-pre>.env</code> 文件。</p>
<h3 id="环境变量类型" tabindex="-1"><a class="header-anchor" href="#环境变量类型"><span>环境变量类型</span></a></h3>
<p><code v-pre>.env</code> 文件中的所有变量通常都解析为字符串，因此创建了一些保留值，以允许您从 <code v-pre>env()</code> 函数返回更广泛的类型:</p>
<table>
<thead>
<tr>
<th><code v-pre>.env</code> Value</th>
<th><code v-pre>env()</code> Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>true</td>
<td>(bool) true</td>
</tr>
<tr>
<td>(true)</td>
<td>(bool) true</td>
</tr>
<tr>
<td>false</td>
<td>(bool) false</td>
</tr>
<tr>
<td>(false)</td>
<td>(bool) false</td>
</tr>
<tr>
<td>empty</td>
<td>(string) ‘’</td>
</tr>
<tr>
<td>(empty)</td>
<td>(string) ‘’</td>
</tr>
<tr>
<td>null</td>
<td>(null) null</td>
</tr>
<tr>
<td>(null)</td>
<td>(null) null</td>
</tr>
</tbody>
</table>
<p>如果需要使用包含空格的值定义环境变量，则可以通过将该值括在双引号中来实现</p>
<div class="language-ini line-numbers-mode" data-highlighter="prismjs" data-ext="ini" data-title="ini"><pre v-pre class="language-ini"><code><span class="line"><span class="token key attr-name">APP_NAME</span><span class="token punctuation">=</span><span class="token value attr-value">"<span class="token inner-value">My Application</span>"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3 id="检索环境配置" tabindex="-1"><a class="header-anchor" href="#检索环境配置"><span>检索环境配置</span></a></h3>
<p>当应用程序收到请求时 <code v-pre>.env</code> 文件中列出的所有变量将被加载到 PHP 的超级全局变量 <code v-pre>$_ENV</code> 中。你可以使用 <code v-pre>env</code> 函数检索这些变量的值。实际上，如果你看过 Laravel 的配置文件，就能注意到有数个选项已经使用了这个函数：</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php" data-title="php"><pre v-pre class="language-php"><code><span class="line"><span class="token string single-quoted-string">'debug'</span> <span class="token operator">=></span> <span class="token function">env</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'APP_DEBUG'</span><span class="token punctuation">,</span> <span class="token constant boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><code v-pre>env</code> 函数的第二个参数是【默认值】。 当没有找到对应环境变量时将返回 【默认值】。</p>
<h3 id="获取当前环境配置" tabindex="-1"><a class="header-anchor" href="#获取当前环境配置"><span>获取当前环境配置</span></a></h3>
<p>当前应用的环境配置是从你的<code v-pre>.env</code> 文件中的 <code v-pre>APP_ENV</code> 变量配置的。你可以通过 <code v-pre>App</code> <a href="https://learnku.com/docs/laravel/11.x/facades" target="_blank" rel="noopener noreferrer">facade</a> 的 <code v-pre>environment</code> 函数获取：</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php" data-title="php"><pre v-pre class="language-php"><code><span class="line"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>App</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token variable">$environment</span> <span class="token operator">=</span> <span class="token class-name static-context">App</span><span class="token operator">::</span><span class="token function">environment</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你还可以将参数传递给 <code v-pre>environment</code> 函数，以确定环境是否与给定值匹配。如果环境与任何给定值匹配，则该方法将返回 <code v-pre>true</code></p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php" data-title="php"><pre v-pre class="language-php"><code><span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name static-context">App</span><span class="token operator">::</span><span class="token function">environment</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'local'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token comment">// The environment is local</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name static-context">App</span><span class="token operator">::</span><span class="token function">environment</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'local'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'staging'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token comment">// The environment is either local OR staging...</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote>
<p>[!技巧]<br>
当前应用程序的环境检测，可以通过定义服务器级 <code v-pre>APP_ENV</code> 环境变量来覆盖。</p>
</blockquote>
<h3 id="加密环境文件" tabindex="-1"><a class="header-anchor" href="#加密环境文件"><span>加密环境文件</span></a></h3>
<p>未加密的环境文件不应存储在源代码控制中。然而，Laravel 允许你加密你的环境文件，以便它们可以安全地添加到源代码控制中。</p>
<h4 id="加密" tabindex="-1"><a class="header-anchor" href="#加密"><span>加密</span></a></h4>
<p>为了加密环境文件，你可以使用 <code v-pre>env:encrypt</code> 命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:encrypt</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>运行 <code v-pre>env:encrypt</code> 命令将加密你的 <code v-pre>.env</code> 文件，并将加密的内容放在 <code v-pre>.env.encrypted</code> 文件中。解密密钥将出现在命令的输出中，并应存储在一个安全的密码管理器中。如果你想提供你自己的加密密钥，你可以在调用该命令时使用 <code v-pre>--key</code> 选项:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:encrypt <span class="token parameter variable">--key</span><span class="token operator">=</span>3UVsEgGVK36XN82KKeyLFMhvosbZN1aF</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><blockquote>
<p><strong>注意</strong><br>
所提供的密钥的长度应该与所使用的加密密码所要求的密钥长度相匹配。默认情况下，Laravel 会使用 <code v-pre>AES-256-CBC</code> 密码，需要一个 32 个字符的密钥。你可以自由地使用 Laravel 的 <a href="https://learnku.com/docs/laravel/11.x/encryption" target="_blank" rel="noopener noreferrer">encrypter</a> 所支持的任何密码，只要在调用该命令时传递 <code v-pre>--cipher</code> 选项即可</p>
</blockquote>
<p>如果你的应用程序有多个环境文件，如<code v-pre>.env</code> 和<code v-pre>.env.staging</code>，你可以通过 <code v-pre>--env</code> 选项提供环境名称来指定应该被加密的环境文件:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:encrypt <span class="token parameter variable">--env</span><span class="token operator">=</span>staging</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4 id="解密" tabindex="-1"><a class="header-anchor" href="#解密"><span>解密</span></a></h4>
<p>要解密一个环境文件，你可以使用 <code v-pre>env:decrypt</code> 命令。这个命令需要一个解密密钥，Laravel 会从 <code v-pre>LARAVEL_ENV_ENCRYPTION_KEY</code> 环境变量中获取：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:decrypt</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>或者，可以通过 <code v-pre>--key</code> 选项直接向命令提供密钥：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:decrypt <span class="token parameter variable">--key</span><span class="token operator">=</span>3UVsEgGVK36XN82KKeyLFMhvosbZN1aF</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>当调用 <code v-pre>env:decrypt</code> 命令时，Laravel 将解密 <code v-pre>.env.encrypted</code> 文件的内容，并将解密后的内容放入 <code v-pre>.env</code> 文件中。<br>
可以通过向 <code v-pre>env:decrypt</code> 命令提供 <code v-pre>--cipher</code> 选项来使用自定义加密算法：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:decrypt <span class="token parameter variable">--key</span><span class="token operator">=</span>qUWuNRdfuImXcKxZ <span class="token parameter variable">--cipher</span><span class="token operator">=</span>AES-128-CBC</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>如果应用程序有多个环境文件，例如 <code v-pre>.env</code> 和 <code v-pre>.env.staging</code>，可以通过提供 <code v-pre>--env</code> 选项来指定应解密的环境文件的名称：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:decrypt <span class="token parameter variable">--env</span><span class="token operator">=</span>staging</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>为了覆盖现有的环境文件，可以向 <code v-pre>env:decrypt</code> 命令提供 <code v-pre>--force</code> 选项：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan env:decrypt <span class="token parameter variable">--force</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2 id="访问配置值" tabindex="-1"><a class="header-anchor" href="#访问配置值"><span>访问配置值</span></a></h2>
<p>您可以通过 <code v-pre>Config</code> 门面或全局 <code v-pre>config</code> 函数轻松访问应用程序中的配置值。配置值可以使用“点”语法访问，该语法包括您希望访问的文件和选项的名称。还可以指定一个默认值，如果配置选项不存在，将返回该默认值：</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php" data-title="php"><pre v-pre class="language-php"><code><span class="line"><span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Support<span class="token punctuation">\</span>Facades<span class="token punctuation">\</span>Config</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token class-name static-context">Config</span><span class="token operator">::</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'app.timezone'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token function">config</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'app.timezone'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">// 如果配置值不存在，则检索默认值...</span></span>
<span class="line"><span class="token variable">$value</span> <span class="token operator">=</span> <span class="token function">config</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'app.timezone'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'Asia/Seoul'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>要在运行时设置配置值，可以调用 <code v-pre>Config</code> 门面的 <code v-pre>set</code> 方法或向 <code v-pre>config</code> 函数传递一个数组：</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php" data-title="php"><pre v-pre class="language-php"><code><span class="line"><span class="token class-name static-context">Config</span><span class="token operator">::</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'app.timezone'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'America/Chicago'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'app.timezone'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'America/Chicago'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>为了协助静态分析，<code v-pre>Config</code> facade 还提供了类型化的配置检索方法。如果检索到的配置值与预期类型不匹配，将抛出异常：</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php" data-title="php"><pre v-pre class="language-php"><code><span class="line"><span class="token class-name static-context">Config</span><span class="token operator">::</span><span class="token keyword type-declaration">string</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'config-key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token class-name static-context">Config</span><span class="token operator">::</span><span class="token function">integer</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'config-key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token class-name static-context">Config</span><span class="token operator">::</span><span class="token keyword type-declaration">float</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'config-key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token class-name static-context">Config</span><span class="token operator">::</span><span class="token function">boolean</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'config-key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token class-name static-context">Config</span><span class="token operator">::</span><span class="token function">array</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'config-key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="配置缓存" tabindex="-1"><a class="header-anchor" href="#配置缓存"><span>配置缓存</span></a></h2>
<p>为了提高应用程序的速度，你应该使用 <code v-pre>config:cache</code> Artisan 命令将所有配置文件缓存到一个文件中。这将把你的应用程序的所有配置选项合并到一个文件中，框架可以快速加载该文件。</p>
<p>你通常应该在生产部署过程中运行 <code v-pre>php artisan config:cache</code> 命令。 该命令不应在本地开发期间运行，因为在应用程序开发过程中经常需要更改配置选项。</p>
<p>一旦配置被缓存，应用程序的 <code v-pre>.env</code> 文件将不会在请求或 Artisan 命令期间被框架加载；因此， <code v-pre>env</code> 函数将只返回外部的系统级环境变量。</p>
<p>因此，应确保仅从应用程序的配置 <code v-pre>config</code> 文件中调用 <code v-pre>env</code> 函数。通过检查 Laravel 的默认配置文件，你可以看到许多示例。可以使用 config 函数从应用程序中的任何位置访问配置值 如上所述。</p>
<p>因此，应该确保只从应用程序的配置（<code v-pre>config</code>）文件中调用 <code v-pre>env</code> 函数。你可以通过查看 Laravel 的默认配置文件来看到许多这样的例子。可以使用上面<a href="#accessing-configuration-values">描述的 <code v-pre>config</code> 函数</a> 从应用程序的任何地方访问配置值。</p>
<p>可以使用 <code v-pre>config:clear</code> 命令清除缓存的配置：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan config:clear</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><blockquote>
<p><strong>注意</strong><br>
如果在部署过程中执行 <code v-pre>config:cache</code> 命令，你应该确保只从配置文件中调用 <code v-pre>env</code> 函数。一旦配置被缓存，<code v-pre>.env</code> 文件将不会被加载；因此，<code v-pre>env</code> 函数将只返回外部的、系统级别的环境变量。</p>
</blockquote>
<h2 id="配置发布" tabindex="-1"><a class="header-anchor" href="#配置发布"><span>配置发布</span></a></h2>
<p>Laravel 的大多数配置文件已经发布在应用程序的 <code v-pre>config</code> 目录中；然而，某些配置文件如 <code v-pre>cors.php</code> 和 <code v-pre>view.php</code> 默认不会被发布，因为大多数应用程序永远不需要修改它们。</p>
<p>然而，你可以使用 <code v-pre>config:publish</code> Artisan 命令来发布默认未发布的任何配置文件：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan config:publish</span>
<span class="line"></span>
<span class="line">php artisan config:publish <span class="token parameter variable">--all</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="调试模式" tabindex="-1"><a class="header-anchor" href="#调试模式"><span>调试模式</span></a></h2>
<p>你的 <code v-pre>config/app.php</code> 配置文件中的 <code v-pre>debug</code> 选项决定了实际向用户显示的错误信息量。默认情况下，此选项设置遵循存储在 <code v-pre>.env</code> 文件中的 <code v-pre>APP_DEBUG</code> 环境变量的值。</p>
<blockquote>
<p><strong>注意</strong><br>
对于本地开发，你应该将 <code v-pre>APP_DEBUG</code> 环境变量设置为 <code v-pre>true</code>。<strong>在生产环境中，这个值应该始终为 <code v-pre>false</code>。如果在生产中将变量设置为 <code v-pre>true</code>，你将冒着向应用程序的最终用户暴露敏感配置值的风险。</strong></p>
</blockquote>
<h2 id="维护模式" tabindex="-1"><a class="header-anchor" href="#维护模式"><span>维护模式</span></a></h2>
<p>当你的应用程序处于维护模式时，所有请求到你的应用程序的请求都会显示一个自定义视图。这使得在更新应用程序或进行维护时「禁用」你的应用程序变得很简单。维护模式检查包含在应用程序的默认中间件堆栈中。如果应用程序处于维护模式，将抛出一个带有 503 状态码的 <code v-pre>Symfony\Component\HttpKernel\Exception\HttpException</code> 实例。</p>
<p>要启用维护模式，请执行 <code v-pre>down</code>Artisan 命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan down</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>如果你希望 <code v-pre>Refresh</code> HTTP 标头与所有维护模式响应一起发送，你可以在调用 <code v-pre>down</code> 命令时提供 <code v-pre>refresh</code> 选项。 <code v-pre>Refresh</code> 标头将指示浏览器在指定秒数后自动刷新页面：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan down <span class="token parameter variable">--refresh</span><span class="token operator">=</span><span class="token number">15</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>你还可以为 <code v-pre>down</code> 命令提供 <code v-pre>retry</code> 选项，该选项将设置 <code v-pre>Retry-After</code> HTTP 标头的值, 尽管浏览器通常会忽略此标头：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan down <span class="token parameter variable">--retry</span><span class="token operator">=</span><span class="token number">60</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4 id="绕过维护模式" tabindex="-1"><a class="header-anchor" href="#绕过维护模式"><span>绕过维护模式</span></a></h4>
<p>即使在维护模式下，你也可以使用 <code v-pre>secret</code> 选项来指定维护模式绕过令牌：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan down <span class="token parameter variable">--secret</span><span class="token operator">=</span><span class="token string">"1630542a-246b-4b66-afa1-dd72a4c43515"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>将应用程序置于维护模式后，你可以访问与该令牌匹配的应用程序 URL，Laravel 将为你的浏览器颁发一个维护模式绕过 cookie ：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>如果你希望 Laravel 为你生成秘密令牌，你可以使用 <code v-pre>with-secret</code> 选项。将应用程序置于维护模式后，该秘密令牌将显示给你：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan down --with-secret</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>当访问此隐藏路由时，你将被重定向到应用程序的 <code v-pre>/</code> 路径。一旦 cookie 被颁发到你的浏览器，你就可以像维护模式不存在一样正常浏览应用程序。</p>
<blockquote>
<p>[技巧]<br>
你的维护模式 secret 通常应由字母数字字符和可选的破折号组成。应避免使用 URL 中具有特殊含义的字符，例如 <code v-pre>?</code> 或 <code v-pre>&amp;</code> 。</p>
</blockquote>
<h4 id="多服务器上的维护模式" tabindex="-1"><a class="header-anchor" href="#多服务器上的维护模式"><span>多服务器上的维护模式</span></a></h4>
<p>默认情况下，Laravel 使用基于文件的系统来确定你的应用程序是否处于维护模式。这意味着要激活维护模式，需要在托管应用程序的每个服务器上执行 <code v-pre>php artisan down</code> 命令。<br>
另外，Laravel 提供了一种基于缓存的维护模式处理方法。这种方法只需在一台服务器上运行 <code v-pre>php artisan down</code> 命令。要使用这种方法，请修改应用程序 <code v-pre>config/app.php</code> 文件中的 “driver” 设置为 <code v-pre>cache</code>。然后，选择一个所有服务器都可以访问的缓存 <code v-pre>store</code>。这样可以确保维护模式状态在每台服务器上保持一致：</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php" data-title="php"><pre v-pre class="language-php"><code><span class="line"><span class="token string single-quoted-string">'maintenance'</span> <span class="token operator">=></span> <span class="token punctuation">[</span></span>
<span class="line">    <span class="token string single-quoted-string">'driver'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'cache'</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token string single-quoted-string">'store'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'database'</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">]</span><span class="token punctuation">,</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="预渲染维护模式视图" tabindex="-1"><a class="header-anchor" href="#预渲染维护模式视图"><span>预渲染维护模式视图</span></a></h4>
<p>如果你在部署过程中使用 <code v-pre>php artisan down</code> 命令，你的用户在 Composer 依赖项或其他基础设施组件更新时仍可能偶尔遇到错误，如果他们在此时访问应用程序。这是因为 Laravel 框架的在部分必须启动才能确定应用程序处于维护模式，并使用模板引擎呈现维护模式视图。<br>
因此，Laravel 允许你预渲染一个维护模式视图，该视图将在请求周期的最开始返回。这个视图在应用程序的任何依赖项加载之前就被渲染了。你可以使用 <code v-pre>down</code> 命令的 <code v-pre>render</code> 选项来预渲染你选择的模板：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan down <span class="token parameter variable">--render</span><span class="token operator">=</span><span class="token string">"errors::503"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4 id="重定向维护模式请求" tabindex="-1"><a class="header-anchor" href="#重定向维护模式请求"><span>重定向维护模式请求</span></a></h4>
<p>在维护模式下，Laravel 将为用户尝试访问的所有应用程序 URL 显示维护模式视图。如果你愿意，你可以指示 Laravel 将所有请求重定向到特定 URL。这可以通过使用 <code v-pre>redirect</code> 选项来完成。例如，你可能希望将所有请求重定向到 <code v-pre>/</code> URI：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan down <span class="token parameter variable">--redirect</span><span class="token operator">=</span>/</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h4 id="禁用维护模式" tabindex="-1"><a class="header-anchor" href="#禁用维护模式"><span>禁用维护模式</span></a></h4>
<p>要禁用维护模式，请使用 <code v-pre>up</code> 命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh" data-title="sh"><pre v-pre class="language-bash"><code><span class="line">php artisan up</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><blockquote>
<p><strong>技巧</strong><br>
你可以通过在 <code v-pre>resources/views/errors/503.blade.php</code> 中定义自己的维护模式模板。</p>
</blockquote>
<h4 id="维护模式-队列" tabindex="-1"><a class="header-anchor" href="#维护模式-队列"><span>维护模式 &amp; 队列</span></a></h4>
<p>当应用程序处于维护模式时，将不会处理任何 <a href="https://learnku.com/docs/laravel/11.x/queues" target="_blank" rel="noopener noreferrer">队列任务</a>。一旦应用程序退出维护模式，任务将继续正常处理。</p>
<h4 id="维护模式的替代方案" tabindex="-1"><a class="header-anchor" href="#维护模式的替代方案"><span>维护模式的替代方案</span></a></h4>
<p>由于维护模式要求你的应用程序有几秒钟的停机时间，因此请考虑使用 <a href="https://vapor.laravel.com/" target="_blank" rel="noopener noreferrer">Laravel Vapor</a> 和 <a href="https://envoyer.io/" target="_blank" rel="noopener noreferrer">Envoyer</a> 等替代方案来实现 Laravel 的零停机时间部署。</p>
<blockquote>
<p>本译文仅用于学习和交流目的，转载请务必注明文章译者、出处、和本文链接<br>
我们的翻译工作遵照 <a href="https://learnku.com/docs/guide/cc4.0/6589" target="_blank" rel="noopener noreferrer">CC 协议</a>，如果我们的工作有侵犯到您的权益，请及时联系我们。</p>
</blockquote>
<hr>
<blockquote>
<p>原文地址：<a href="https://learnku.com/docs/laravel/11.x/configurationmd/16648" target="_blank" rel="noopener noreferrer">https://learnku.com/docs/laravel/11.x/co...</a></p>
<p>译文地址：<a href="https://learnku.com/docs/laravel/11.x/configurationmd/16648" target="_blank" rel="noopener noreferrer">https://learnku.com/docs/laravel/11.x/co...</a></p>
</blockquote>
</div></template>


